package rothag.graphics;

import java.awt.Component;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.HashMap;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import rothag.enums.TypeDes;
import rothag.views.JPanelBase;

/**
 * Fournit un ensemble de méthode pour faciliter le déveoppement de la partie graphique
 * @author Gaetan
 */
public class GraphicsHelper {

    public static final HashMap<String, ImageIcon> listeImageIcon = new HashMap<String, ImageIcon>();
    public static final HashMap<String, Image> listeImage = new HashMap<String, Image>();

    /**
     * Retourne la font à partir du style et de la taille voulue. La police est définie dans les paramètres
     * @param size Taille de la font
     * @param style Style de la font
     * @return Un objet Font
     */
    public static Font getFont(Integer size, String style) {
        StringBuilder buffer = new StringBuilder(GraphicsParameters.font);

        if (style != null) {
            buffer.append("-");
            buffer.append(style);
        }

        if (size != null) {
            buffer.append("-");
            buffer.append(size.toString());
        }

        return Font.decode(buffer.toString());
    }

    /**
     * Permet de définir les bornes d'un objet héritant de JPanelBase.
     * @param x Coordonnée X
     * @param y Coordonnée Y
     * @param panel Panel à défnir
     */
    public static void setBounds(int x, int y, JPanelBase panel) {
        panel.setBounds(x, y, panel.getLargeur(), panel.getHauteur());
    }

    /**
     * Retourne l'image correspondante à un type de dé
     * @param des Type de dé
     * @return Image du type de dé
     */
    public static String getPathImageDes(TypeDes des) {
        switch (des) {
            case CRANE:
                return GraphicsParameters.pathDesCranes;
            case JARRE:
                return GraphicsParameters.pathDesRessource;
            case NOURRITURE:
                return GraphicsParameters.pathDesFood;
            case PIECE:
                return GraphicsParameters.pathDesMonnaie;
            case TRAVAILLEURS:
                return GraphicsParameters.pathDesOuvriers;
            case TRAVAILLEURSNOURRITURE:
                return GraphicsParameters.pathDesOuvFood;
            default:
                return null;
        }
    }

    /**
     * Retourne un message d'erreur à afficher.
     * setVisible(true) à faire sur l'objet retourné pour afficher le message
     * @param titre Titre du message
     * @param msg Message
     * @param parent Composant devant afficher le message
     * @return JDialog à afficher
     */
    public static JDialog afficherErreur(String titre, String msg, Component parent) {
        JOptionPane pane = new JOptionPane(msg, JOptionPane.ERROR_MESSAGE);
        JDialog dialog = pane.createDialog(parent, titre);
        return dialog;
    }

    /**
     * Affiche le curseur de type "main" sur un composant
     * @param c Composant
     */
    public static void setCursorHand(Component c) {
        if (c != null) {
            c.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }
    }

    /**
     * Récupère une image à partir de son chemin
     * @param path Chemin de l'image
     * @param c Composant
     * @return Image créée
     */
    public static Image getImage(String path, Component c) {
        if (listeImage.containsKey(path)) {
            return listeImage.get(path);
        } else {
            Toolkit tk = c.getToolkit();
            Image image = tk.getImage(c.getClass().getResource(path));
            listeImage.put(path, image);
            return image;
        }
    }

    /**
     * Récupère une image à partir de son chemin
     * @param path Chemin de l'image
     * @param c Composant
     * @return ImageIcon créée
     */
    public static ImageIcon getImageIcon(String path, Component c) {
        if (listeImageIcon.containsKey(path)) {
            return listeImageIcon.get(path);
        } else {
            ImageIcon imageIcon = new ImageIcon(c.getClass().getResource(path));
            listeImageIcon.put(path, imageIcon);
            return imageIcon;
        }
    }
}
